
package com.partner.service.sysright;

import java.util.*;

import javax.servlet.http.HttpSession;

import org.apache.commons.collections.map.HashedMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.partner.bean.sysright.Sysbuttons;
import com.partner.bean.sysright.TRelationship;
import com.partner.bean.sysright.TSysright;
import com.partner.bean.sysright.TSysrightVo;
import com.partner.mapper.sysright.SysbuttonsMapper;
import com.partner.mapper.sysright.TRelationshipMapper;
import com.partner.mapper.sysright.TSysrightMapper;

@Service("sysRightManagerService")
public class SysRightManagerService {
	
	@Autowired
	private TSysrightMapper sysrightMapper;
	
	@Autowired
	private TRelationshipMapper relationshipMapper;
	
	@Autowired
	private SysbuttonsMapper sysbuttonsMapper;
	
	/**
	 * @Title      : getAllParentRights 
	 * @Description: 根据父节点查询权限
	 * @param id     0
	 * @return     : List<TSysright>
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月2日 下午3:01:07
	 * @throws 
	 */
	public List<TSysrightVo> getAllParentRights(int id,int roleid,HttpSession session){
		
		 List<TSysrightVo> list = sysrightMapper.selectByParentId(id);
		 List<TSysrightVo> rlist =  new ArrayList<>();
		 for(int i = 0 ; i < list.size() ; i++){
			 TSysrightVo o = list.get(i);
			
			 if(o!=null){
				 if(o.getButtons()!=null){
					 String[] sbutton = o.getButtons().split(",");
					 List<Sysbuttons> list1 = new ArrayList<>();
					 for(int j = 0 ; j<sbutton.length ; j++){
						 Sysbuttons sb = sysbuttonsMapper.selectByPrimaryKey(Integer.valueOf(sbutton[j]));
						 list1.add(sb); 
					 }
					 o.setButtonright(list1);
				 }
				 //处理被赋权的按钮
				Map<String, Integer> map = new HashedMap();
				map.put("roid", roleid);
				map.put("rgid", o.getId());
				List<TRelationship> countl = relationshipMapper.selectByRoleIdAndRightId(map);
				if(countl!=null&&countl.size()>0){
					for(int x=0 ; x<countl.size() ; x++){
						TRelationship	count = countl.get(x);
						o.setCheckbuttons(count.getButtons());
						if(count.getButtons()!=null){
							String[] checkbuttons = count.getButtons().split(",");
							for(int z=0 ; z< checkbuttons.length ; z++){
								if(session!=null){
									session.setAttribute("button"+id+"t"+o.getId()+"t"+checkbuttons[z], true);
								}
							}
						}
					}
					rlist.add(o);
				}
			 }
			 
		 }
		
		return rlist ;
	}
	
	/**
	 * @Title      : selectRightByRole 
	 * @Description: 根据角色ID查询此角色拥有的权限
	 * @param id
	 * @return     : List<TSysrightVo>
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月5日 下午4:27:04
	 * @throws 
	 */
	public List<TSysrightVo> selectRightByRole(int id,HttpSession session){
		//查询此角色拥有的所有父节点
		List<TSysrightVo> tSysrightVos = sysrightMapper.selectRightByRole(id);
		
		//填充父节点的子节点
		List<TSysrightVo> fullItems = fullItems(tSysrightVos,id,session);
		
		return fullItems;
	}
	
	/**
	 * @Title      : getRightsItem 
	 * @Description: 通过查询所有父节点权限 填充父节点的子节点
	 * @return     : List<TSysrightVo>
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月2日 下午2:56:55
	 * @throws 
	 */
	public List<TSysrightVo> getRightsItem(){
		//所有父节点权限
		List<TSysrightVo> allParentRights = getAllParentRights(0,0,null);
		
		//填充子节点
		List<TSysrightVo> tSysrightVos = fullItems(allParentRights,0,null);
		
		return tSysrightVos;
		
	}
	
	/**
	 * @Title      : fullItems 
	 * @Description: 传入所有父节点权限  填充子节点
	 * @param allParentRights     : void
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月5日 下午3:11:32
	 * @throws 
	 */
	public List<TSysrightVo> fullItems(List<TSysrightVo> allParentRights,int roleid,HttpSession session){
		List<TSysrightVo> tSysrightVos = new ArrayList<>();
		for (TSysrightVo data : allParentRights) {
			//初始化权限扩展类
			TSysrightVo tSysrightVo = new TSysrightVo();
			
					//当前父节点下的子节点
					List<TSysrightVo> itemRights = getAllParentRights(data.getId(),roleid,session);
					
					//填充子权限
					tSysrightVo.setMenuItems(itemRights);
					
					//填充父节点基本数据
					tSysrightVo.setId(data.getId());
					tSysrightVo.setRightname(data.getRightname());
					tSysrightVo.setCreatetime(data.getCreatetime());
					tSysrightVo.setParentid(data.getParentid());
					tSysrightVo.setRighticon(data.getRighticon());
					tSysrightVo.setRighturl(data.getRighturl());
					tSysrightVo.setIconname(data.getIconname());
					
			//填充到权限集合
			tSysrightVos.add(tSysrightVo);
		}
		
		return tSysrightVos;
	}
	
	/**
	 * @Title      : allRightsMachine 
	 * @Description:  加工所有权限集合 根据当前角色已有的权限设置allRights集合中的对象是否被选中
	 * @param allRights 所有权限
	 * @param rightByRoleId  当前角色拥有的权限
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月3日 上午8:51:26
	 * @throws 
	 */
	public void allRightsMachine(List<TSysrightVo> allRights,int roleid){
		//循环所有权限
		for (TSysrightVo all : allRights) {
			Map<String, Integer> map = new HashedMap();
			map.put("roid", roleid);
			map.put("rgid", all.getId());
			List<TRelationship> countl = relationshipMapper.selectByRoleIdAndRightId(map);
			if(countl != null && countl.size()>0){
				all.setCheck(true);
			}

			//获取当前父节点下的子节点
			List<TSysrightVo> menuItems = all.getMenuItems();
			
			for (TSysrightVo item : menuItems) {
				Map<String, Integer> map2 = new HashedMap();
				map2.put("roid", roleid);
				map2.put("rgid", item.getId());
				List<TRelationship> countl2 = relationshipMapper.selectByRoleIdAndRightId(map2);
				if(countl2 != null && countl2.size()>0){
					item.setCheck(true);
					for(int i=0 ; i<countl2.size() ; i++){
						TRelationship count2 = countl2.get(i);
						if(count2.getButtons()!=null&&!count2.getButtons().equals("")){
							item.setCheckbuttons(count2.getButtons());
						}
					}
					
				}
				
			}
		}
	}
	
	/**
	 * @Title      : getAllRight 
	 * @Description: 查询所有权限
	 * @return     : List<TSysright>
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月3日 下午5:49:59
	 * @throws 
	 */
	public List<TSysrightVo> getAllRight(TSysrightVo right){
		return sysrightMapper.selectAll(right);
	}
	
	/**
	 * @Title      : selectByPrimaryKey 
	 * @Description: 通过权限ID查询
	 * @param id
	 * @return     : TSysrightVo
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月4日 上午10:47:39
	 * @throws 
	 */
	public TSysright selectByPrimaryKey(int id){
		return sysrightMapper.selectByPrimaryKey(id);
	}

	/**
	 * @Title      : selectMaxOrdernum 
	 * @Description: 获取父节点最大的权限排列顺序
	 * @return     : int
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月4日 上午11:37:12
	 * @throws 
	 */
	public int selectMaxOrdernum() {
		return sysrightMapper.selectMaxOrdernum().intValue();
	}
	
	/**
	 * @Title      : updateSysRight 
	 * @Description: 修改权限 有判断(带条件修改)
	 * @param record
	 * @return     : int
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月4日 下午2:27:20
	 * @throws 
	 */
	public int updateSysRight(TSysright record){
		return sysrightMapper.updateByPrimaryKeySelective(record);
	}
	
	/**
	 * @Title      : deleteSysRight 
	 * @Description: 根据权限主键ID删除权限
	 * @param id
	 * @return     : int
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月4日 下午2:42:04
	 * @throws 
	 */
	public int deleteSysRight(int id){
		return sysrightMapper.deleteByPrimaryKey(id);
	}
	
	/**
	 * @Title      : getSysRightByPrimaryKey 
	 * @Description: 根据权限主键ID查询权限
	 * @param id
	 * @return     : TSysright
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月4日 下午4:09:56
	 * @throws 
	 */
	public TSysright getSysRightByPrimaryKey(int id){
		return sysrightMapper.selectByPrimaryKey(id);
	}
	
	/**
	 * @Title      : insert 
	 * @Description: 权限新增
	 * @param right     : void
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月5日 上午8:41:31
	 * @throws 
	 */
	public void insert(TSysrightVo right){
		sysrightMapper.insertSelective(right);
	}
	
	/**
	 * @Title      : getMaxOrderNum 
	 * @Description: 获得排列顺序最大值+1
	 * @return     : int
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月5日 上午9:38:21
	 * @throws 
	 */
	public Integer getMaxParentOrderNum(){
		return sysrightMapper.selectMaxParentOrderNum();
	}
	
	
	/**
	 * @Title      : getMaxOrderNum 
	 * @Description: 查询某个父节点下 排列顺序最大值+0.1
	 * @return     : double
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月5日 上午9:48:13
	 * @throws 
	 */
	public Double getMaxOrderNum(int id){
		return sysrightMapper.selectMaxOrderNum(id);
	}
	
	/**
	 * @Title      : selectByOrdernum 
	 * @Description: 根据排列顺序值查询
	 * @param num
	 * @return     : Double
	 * @author     : Lizuoyang
	 * Create Date : 2017年5月5日 上午10:47:00
	 * @throws 
	 */
	public TSysright selectByOrdernum(double num){
		return sysrightMapper.selectByOrdernum(num);
	}
}
